<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
</head>

<body>
  <!-- 
    数组扁平化: 取出嵌套数组(多维)中的所有元素放到一个新数组(一维)中
            如: [1, [3, [2, 4]]]  ==>  [1, 3, 2, 4]
   -->
  <script>
    let arr = [1, [3, [2, [4, 5]]]];
    // 方法1
    Array.prototype.flatten1 = function () {
      // 1. forEach 版本
      /* let arr = [];
      this.forEach(item => {
        // if (Array.isArray(item)) {
        //   arr = arr.concat(item.flatten1())
        // } else {
        //   arr = arr.concat(item)
        // }
        // 1.1 简化
        arr = arr.concat(Array.isArray(item) ? item.flatten1() : item)
      })
      return arr; */

      // 2. reduce 版本
      return this.reduce((pre, item) => {
        pre = pre.concat(!Array.isArray(item) ? item : item.flatten1())
        return pre;
      }, [])
    }

    // 方法2
    Array.prototype.flatten2 = function () {
      let arr = [].concat(...this);

      while(arr.some( item => Array.isArray(item))){
        arr = [].concat(...arr)
      }

      return arr;
    }

    console.log(arr.flatten1())
    console.log(arr.flatten2())
  </script>
</body>

</html>